bitkeeper revision 1.1159.1.111 (412ef44aeLKE7Ni8u9PHp6mOfGp8ow)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 27 Aug 2004 08:43:54 +0000 (08:43 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 27 Aug 2004 08:43:54 +0000 (08:43 +0000)
Add some more events for domains and migrate/save.

tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendMigrate.py

index 05eb28cbe8be0dbc1bb9feac4693d713120da45c..c4180da8e5f88401a66aba7db405dddefbdac30f 100644 (file)
@@ -256,7 +256,10 @@ class XendDomain:
                         eserver.inject('xend.domain.suspended', [name, id])
                         continue
                 if reason in ['poweroff', 'reboot']:
+                    eserver.inject('xend.domain.exit', [name, id, reason])
                     self.domain_restart_schedule(id, reason)
+            else:
+               eserver.inject('xend.domain.exit', [name, id, 'crash']) 
             destroyed += 1
             self.final_domain_destroy(id)
         if self.domain_restarts_exist():
index de207aeb5cfd500a51fbc1f7a96bf08159a05240..af99393f852bc324981c4974e5f7e7b9d06cea38 100644 (file)
@@ -17,6 +17,7 @@ import sxp
 import XendDB
 import EventServer; eserver = EventServer.instance()
 from XendError import XendError
+from XendLogging import log
         
 """The port for the migrate/save daemon xfrd."""
 XFRD_PORT = 8002
@@ -289,6 +290,8 @@ class XendMigrateInfo(XfrdInfo):
         if not vmconfig:
             xfrd.loseConnection()
             return
+        log.info('Migrate BEGIN: ' + str(self.sxpr()))
+        eserver.inject('xend.migrate.begin', self.sxpr())
         xfrd.request(['xfr.migrate',
                       self.src_dom,
                       vmconfig,
@@ -308,10 +311,12 @@ class XendMigrateInfo(XfrdInfo):
         print 'XfrdMigrateInfo>connectionLost>', reason
         XfrdInfo.connectionLost(self, reason)
         if self.state =='ok':
+            log.info('Migrate OK: ' + str(self.sxpr()))
             eserver.inject('xend.migrate.ok', self.sxpr())
         else:
             self.state = 'error'
             self.error(XendError("migrate failed"))
+            log.info('Migrate ERROR: ' + str(self.sxpr()))
             eserver.inject('xend.migrate.error', self.sxpr())
 
 class XendSaveInfo(XfrdInfo):
@@ -335,10 +340,14 @@ class XendSaveInfo(XfrdInfo):
         return sxpr
 
     def request(self, xfrd):
+        print '***request>', self.vmconfig()
         vmconfig = self.vmconfig()
         if not vmconfig:
             xfrd.loseConnection()
             return
+        print '***request> begin'
+        log.info('Save BEGIN: ' + str(self.sxpr()))
+        eserver.inject('xend.save.begin', self.sxpr())
         xfrd.request(['xfr.save', self.src_dom, vmconfig, self.file ])
         
     def xfr_save_ok(self, xfrd, val):
@@ -351,10 +360,12 @@ class XendSaveInfo(XfrdInfo):
         print 'XfrdSaveInfo>connectionLost>', reason
         XfrdInfo.connectionLost(self, reason)
         if self.state =='ok':
+            log.info('Save OK: ' + str(self.sxpr()))
             eserver.inject('xend.save.ok', self.sxpr())
         else:
             self.state = 'error'
             self.error(XendError("save failed"))
+            log.info('Save ERROR: ' + str(self.sxpr()))
             eserver.inject('xend.save.error', self.sxpr())
     
 
@@ -388,17 +399,19 @@ class XendMigrate:
     def close(self):
         pass
 
-    def _add_session(self, xid, info):
+    def _add_session(self, info):
+        xid = info.xid
         self.session[xid] = info
         self.session_db[xid] = info.sxpr()
         self.sync_session(xid)
-        #eserver.inject('xend.migrate.begin', info.sxpr())
 
     def _delete_session(self, xid):
-        #eserver.inject('xend.migrate.end', xid)
-        del self.session[xid]
-        del self.session_db[xid]
-        self.db.delete(xid)
+        print '***_delete_session>', xid
+        if xid in self.session:
+            del self.session[xid]
+        if xid in self.session_db:
+            del self.session_db[xid]
+            self.db.delete(xid)
 
     def session_ls(self):
         return self.session.keys()
@@ -410,10 +423,23 @@ class XendMigrate:
         return self.session.get(xid)
 
     def session_begin(self, info):
-        self._add_session(info.xid, info)
+        """Add the session to the table and start it.
+        Set up callbacks to remove the session from the table
+        when it finishes.
+
+        @param info: session
+        @return: deferred
+        """
+        def cbremove(val):
+            print '***cbremove>', val
+            self._delete_session(info.xid)
+            return val
+        self._add_session(info)
+        info.deferred.addCallback(cbremove)
+        info.deferred.addErrback(cbremove)
         xcf = XfrdClientFactory(info)
         reactor.connectTCP('localhost', XFRD_PORT, xcf)
-        return info
+        return info.deferred
     
     def migrate_begin(self, dom, host, port=XFRD_PORT, live=0):
         """Begin to migrate a domain to another host.
@@ -423,12 +449,9 @@ class XendMigrate:
         @param port: destination port
         @return: deferred
         """
-        # Check dom for existence, not migrating already.
-        # Subscribe to migrate notifications (for updating).
         xid = self.nextid()
         info = XendMigrateInfo(xid, dom, host, port, live)
-        self.session_begin(info)
-        return info.deferred
+        return self.session_begin(info)
 
     def save_begin(self, dom, file):
         """Begin saving a domain to file.
@@ -439,8 +462,7 @@ class XendMigrate:
         """
         xid = self.nextid()
         info = XendSaveInfo(xid, dom, file)
-        self.session_begin(info)
-        return info.deferred
+        return self.session_begin(info)
 
 def instance():
     global inst